package com.tripcube.ai.model.dto;

import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.tripcube.ai.serializer.EmptyStringToNullDeserializer;
import lombok.Data;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

import java.util.List;

/**
 * 创建知识库请求数据传输对象
 * 
 * @author alander
 */
@Data
@Schema(description = "创建知识库请求")
public class CreateKnowledgeBaseDTO {
    /**
     * 知识库名称
     * 知识库的显示名称，用于标识和区分不同的知识库
     */
    @Schema(description = "知识库名称", required = true)
    @NotBlank(message = "知识库名称不能为空")
    @Size(max = 100, message = "知识库名称长度不能超过100个字符")
    private String name;

    /**
     * 知识库描述
     * 知识库的详细描述信息，说明知识库的用途和内容
     */
    @Schema(description = "知识库描述")
    @Size(max = 500, message = "知识库描述长度不能超过500个字符")
    private String description;

    /**
     * 知识库结构类型
     * 定义知识库的数据结构类型：
     * - unstructured: 非结构化数据
     */
    @Schema(description = "知识库结构类型", allowableValues = {"unstructured"}, defaultValue = "unstructured")
    @JsonDeserialize(using = EmptyStringToNullDeserializer.class)
    @JsonSetter(nulls = Nulls.SKIP)
    private String structureType = "unstructured";

    /**
     * 数据源类型
     * 定义知识库的数据来源类型，默认为数据中心分类
     */
    @Schema(description = "数据源类型",allowableValues = {"DATA_CENTER_CATEGORY","DATA_CENTER_FILE"}, defaultValue = "DATA_CENTER_CATEGORY")
    @JsonDeserialize(using = EmptyStringToNullDeserializer.class)
    @JsonSetter(nulls = Nulls.SKIP)
    private String sourceType = "DATA_CENTER_CATEGORY";

    /**
     * 文档ID列表
     * 当数据源类型为DATA_CENTER_FILE时，可以指定文档ID列表，用于初始化知识库（不可为空）
     */
    private List<String> documentIds;

    /**
     * 分类ID列表
     * 当数据源类型为DATA_CENTER_CATEGORY时，可以指定分类ID列表，用于初始化知识库（可为空）
     */
    private List<String> categoryIds;

    /**
     * 向量存储类型
     * 定义向量数据的存储方式，默认使用内置存储
     */
    @Schema(description = "向量存储类型",allowableValues = {"BUILT_IN","ADB"}, defaultValue = "BUILT_IN")
    @JsonDeserialize(using = EmptyStringToNullDeserializer.class)
    @JsonSetter(nulls = Nulls.SKIP)
    private String sinkType = "BUILT_IN";

    /**
     * Embedding模型名称
     * 模型名称，默认使用text-embedding-v2
     */
    @Schema(description = "",allowableValues = {"text-embedding-v2","text-embedding-v3", "text-embedding-v4"}, defaultValue = "text-embedding-v2")
    @JsonDeserialize(using = EmptyStringToNullDeserializer.class)
    @JsonSetter(nulls = Nulls.SKIP)
    private String embeddingModelName = "text-embedding-v2";
}